package transitarios.CLI.callback;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import transitarios.CLI.ILinhaComandos;
import transitarios.CLI.exceptions.SemOpcoesDisponveisException;

public abstract class MultiOpcoesAuxiliar<T> {

	private List<T> list;
	private Map<Integer, T> map;

	public MultiOpcoesAuxiliar(List<T> list) {
		this.list = list;
		this.map = new TreeMap<Integer, T>();
	}

	public abstract String getNomeOpcao(T t);

	private T getOpcaoEscolhida(Integer opcaoEscolhida) {
		return this.map.get(opcaoEscolhida);
	}

	private Map<Integer, String> getOptionsMap() {
		Map<Integer, String> result = new TreeMap<Integer, String>();
		Integer key = 1;
		for (T t : this.list) {

			result.put(key, this.getNomeOpcao(t));
			this.map.put(key, t);
			key++;
		}
		return result;
	}

	public T obterOpcao(ILinhaComandos linhaComandos, String descricaoEscolha)
			throws IOException, SemOpcoesDisponveisException {

		Integer opcaoEscolhidaMatricula = null;

		opcaoEscolhidaMatricula = linhaComandos.obterOpcao(
				this.getOptionsMap(), descricaoEscolha);

		T result = this.getOpcaoEscolhida(opcaoEscolhidaMatricula);

		return result;

	}
}
